from codelinker import ChannelTag,Channels

class EnvironmentChannels(Channels):
    """Channel tags for environment."""
    @property
    def intro(self):
        """Introduction channel is used to introduce the environment setting."""
        return ChannelTag(self.prefix+"intro")
    
    @property
    def response(self):
        """Response channel is used to inform the response of the environment."""
        return ChannelTag(self.prefix+"response")
    
    @property
    def status(self):
        """Inform the update of environment status."""
        return ChannelTag(self.prefix+"status")

class UserChannels(Channels):
    """User channel tags."""
    # @property
    # def profile(self):
    #     """User profile channel is used to update user profile."""
    #     return ChannelTag(self.prefix+"profile")

class AgentChannels(Channels):
    """Agent channel tags."""
    @property
    def proactive(self):
        """Proactive channel is used to inform user and environment about agent's proactive actions."""
        return ChannelTag(self.prefix+"proactive")

    @property
    def ops(self):
        """Ops channel is used to update agent's available operations."""
        return ChannelTag(self.prefix+"ops")
    
    @property
    def actions(self):
        """Actions that the agent takes."""
        return ChannelTag(self.prefix+"actions")
    
    @property
    def response(self):
        """Response channel is used to save the agent response."""
        return ChannelTag(self.prefix+"response")

class SinkChannels(Channels):
    def __init__(self):
        super().__init__("")
        self.env = EnvironmentChannels("env.")
        self.user = UserChannels("user.")
        self.agent = AgentChannels("agent.")
    @property
    def setup(self):
        """Setup channel is used to inform all components to setup."""
        return ChannelTag("setup")

    @property
    def activity(self):
        """Activity channel is used to record activities of user and agent."""
        return ChannelTag("activity")
    
    @property
    def events(self):
        """Events channel is used to record all events that generated by simulater. Agent and user should listen to this channel to produce further ."""
        return ChannelTag("events")
    
                

sinkChannels = SinkChannels()

if __name__ == "__main__":
    print(sinkChannels.all)